package dashboard
import (
"crypto/sha1"
"encoding/hex"
"encoding/json"
"github.com/K-Phoen/grabana/alert"
"github.com/K-Phoen/grabana/row"
"github.com/K-Phoen/grabana/variable/constant"
"github.com/K-Phoen/grabana/variable/custom"
"github.com/K-Phoen/grabana/variable/datasource"
"github.com/K-Phoen/grabana/variable/interval"
"github.com/K-Phoen/grabana/variable/query"
"github.com/K-Phoen/grabana/variable/text"
"github.com/K-Phoen/sdk"
)
type TagAnnotation struct {
Name string
Datasource string
IconColor string `yaml:"color"`
Tags []string `yaml:",flow"`
}
type Option func (dashboard *Builder ) error
type TimezoneOption string
const DefaultTimezone TimezoneOption = ""
const UTC TimezoneOption = "utc"
const Browser TimezoneOption = "browser"
type Builder struct {
board *sdk .Board
alerts []*alert .Alert
}
func New (title string , options ...Option ) (Builder , error ) {
board := sdk .NewBoard (title )
board .ID = 0
builder := &Builder {board : board }
for _ , opt := range append (defaults (), options ...) {
if err := opt (builder ); err != nil {
return *builder , err
}
}
return *builder , nil
}
func defaults() []Option {
return []Option {
defaultTimePicker (),
Timezone (DefaultTimezone ),
Time ("now-3h" , "now" ),
SharedCrossHair (),
}
}
func defaultTimePicker() Option {
return func (builder *Builder ) error {
builder .board .Timepicker = sdk .Timepicker {
RefreshIntervals : []string {"5s" , "10s" , "30s" , "1m" , "5m" , "15m" , "30m" , "1h" , "2h" , "1d" },
TimeOptions : []string {"5m" , "15m" , "1h" , "6h" , "12h" , "24h" , "2d" , "7d" , "30d" },
}
return nil
}
}
func (builder *Builder ) MarshalJSON () ([]byte , error ) {
return json .Marshal (builder .board )
}
func (builder *Builder ) MarshalIndentJSON () ([]byte , error ) {
return json .MarshalIndent (builder .board , "" , " " )
}
func (builder *Builder ) Alerts () []*alert .Alert {
return builder .alerts
}
func (builder *Builder ) Internal () *sdk .Board {
return builder .board
}
func VariableAsConst (name string , options ...constant .Option ) Option {
return func (builder *Builder ) error {
templatedVar := constant .New (name , options ...)
builder .board .Templating .List = append (builder .board .Templating .List , templatedVar .Builder )
return nil
}
}
func ID (id uint ) Option {
return func (builder *Builder ) error {
builder .board .ID = id
return nil
}
}
func UID (uid string ) Option {
return func (builder *Builder ) error {
validUID := uid
if len (uid ) > 40 {
sha := sha1 .Sum ([]byte (uid ))
validUID = hex .EncodeToString (sha [:])
}
builder .board .UID = validUID
return nil
}
}
func Slug (slug string ) Option {
return func (builder *Builder ) error {
builder .board .Slug = slug
return nil
}
}
func VariableAsCustom (name string , options ...custom .Option ) Option {
return func (builder *Builder ) error {
templatedVar := custom .New (name , options ...)
builder .board .Templating .List = append (builder .board .Templating .List , templatedVar .Builder )
return nil
}
}
func VariableAsInterval (name string , options ...interval .Option ) Option {
return func (builder *Builder ) error {
templatedVar := interval .New (name , options ...)
builder .board .Templating .List = append (builder .board .Templating .List , templatedVar .Builder )
return nil
}
}
func VariableAsQuery (name string , options ...query .Option ) Option {
return func (builder *Builder ) error {
templatedVar := query .New (name , options ...)
builder .board .Templating .List = append (builder .board .Templating .List , templatedVar .Builder )
return nil
}
}
func VariableAsDatasource (name string , options ...datasource .Option ) Option {
return func (builder *Builder ) error {
templatedVar := datasource .New (name , options ...)
builder .board .Templating .List = append (builder .board .Templating .List , templatedVar .Builder )
return nil
}
}
func VariableAsText (name string , options ...text .Option ) Option {
return func (builder *Builder ) error {
templatedVar := text .New (name , options ...)
builder .board .Templating .List = append (builder .board .Templating .List , templatedVar .Builder )
return nil
}
}
func ExternalLinks (links ...ExternalLink ) Option {
return func (builder *Builder ) error {
for _ , link := range links {
builder .board .Links = append (builder .board .Links , link .asSdk ())
}
return nil
}
}
func DashboardLinks (links ...DashboardLink ) Option {
return func (builder *Builder ) error {
for _ , link := range links {
builder .board .Links = append (builder .board .Links , link .asSdk ())
}
return nil
}
}
func Row (title string , options ...row .Option ) Option {
return func (builder *Builder ) error {
r , err := row .New (builder .board , title , options ...)
if err != nil {
return err
}
builder .alerts = append (builder .alerts , r .Alerts ()...)
return nil
}
}
func TagsAnnotation (annotation TagAnnotation ) Option {
return func (builder *Builder ) error {
builder .board .Annotations .List = append (builder .board .Annotations .List , sdk .Annotation {
Name : annotation .Name ,
Datasource : &sdk .DatasourceRef {LegacyName : annotation .Datasource },
IconColor : annotation .IconColor ,
Enable : true ,
Tags : annotation .Tags ,
Type : "tags" ,
})
return nil
}
}
func Editable () Option {
return func (builder *Builder ) error {
builder .board .Editable = true
return nil
}
}
func ReadOnly () Option {
return func (builder *Builder ) error {
builder .board .Editable = false
return nil
}
}
func SharedCrossHair () Option {
return func (builder *Builder ) error {
builder .board .SharedCrosshair = true
return nil
}
}
func DefaultTooltip () Option {
return func (builder *Builder ) error {
builder .board .SharedCrosshair = false
return nil
}
}
func Tags (tags []string ) Option {
return func (builder *Builder ) error {
builder .board .Tags = tags
return nil
}
}
func AutoRefresh (interval string ) Option {
return func (builder *Builder ) error {
builder .board .Refresh = &sdk .BoolString {Flag : true , Value : interval }
return nil
}
}
func Time (from , to string ) Option {
return func (builder *Builder ) error {
builder .board .Time = sdk .Time {From : from , To : to }
return nil
}
}
func Timezone (timezone TimezoneOption ) Option {
return func (builder *Builder ) error {
builder .board .Timezone = string (timezone )
return nil
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .